package fbcache

import (
	"encoding/json"
	"fmt"
	"github.com/go-redis/redis"
	"github.com/shopspring/decimal"
	"longmen/server/config/global"
	"longmen/server/internal/rpc/tencentim/imsdk"
	messages2 "longmen/server/internal/rpc/tencentim/messages"
	"longmen/server/internal/rpc/tencentim/messages/sports"
	"longmen/server/internal/services/nami/services/sports/basketball/bbcache"
	"sync"
)

//亚盘就是让球玩法
//	当指数类型为亚盘时 就是主胜，盘口（让球数），客胜
//  让球玩法  主胜 盘口 客胜

//欧赔就是胜平负玩法
//当指数类型为欧赔时 就是主胜，和局，客胜
// 胜平负玩法 主胜，和局，客胜

//大小球就是进球数的大小
//当指数类型为大小球时 就是大球，盘口（大小球数），小球
//角球同理

// 胜平负玩法 主胜，和局，客胜
// 让球玩法  主胜 盘口 客胜
// 大小球 大球，盘口（大小球数），小球
// 角球 大  盘口  小

// Odds 指数数据字段说明（PS：亚盘盘口 - 为正，主让客；为负，客让主）
// （PS：亚盘、大小球、角球 - 赔率为赢率，不包含本金；欧赔 - 赔率为赢率+本金）
type Odds struct {
	CompanyId        int             `json:"company_id"`        // 指数公司id，详见状态码->指数公司ID
	ExponentialType  string          `json:"exponential_type"`  // 指数类型：asia-亚盘、eu-欧赔、bs-大小球、cr-角球
	ExponentialScore string          `json:"exponential_score"` // 进球比分 or 角球比(cr)，主队-客队
	MatchId          int             `json:"match_id"`          // 比赛id
	MatchStatus      int             `json:"match_status"`      // 比赛状态，详见状态码->比赛状态 - int
	OddsStatus       int             `json:"odds_status"`       // 是否封盘：1-封盘,0-未封盘
	Odds1            decimal.Decimal `json:"odds_1"`            // 主胜/大球/大
	Odds2            decimal.Decimal `json:"odds_2"`            // 和局/盘口
	Odds3            decimal.Decimal `json:"odds_3"`            // 客胜/小球/小
	ChangeTime       int64           `json:"change_time"`       // 变化时间
	CompetitionTime  string          `json:"competition_time"`  // 比赛进行时间
}

type OddsCache struct {
	rds redis.UniversalClient
}

var oddsCache *OddsCache
var oddsCacheOnce sync.Once

func NewOddsRedis() *OddsCache {
	oddsCacheOnce.Do(func() {
		oddsCache = &OddsCache{
			rds: global.GetRds(),
		}
	})
	return oddsCache
}

// 生成足球指数key
func (o *OddsCache) genOddsKey(matchId int) string {
	return fmt.Sprintf("match_live:football_odds:%d", matchId)
}

func (o *OddsCache) AsyncPublishLiveOdds(records []Odds) error {
	recordMap := make(map[int][]Odds)
	for _, record := range records {
		recordMap[record.MatchId] = append(recordMap[record.MatchId], record)
	}
	pp := o.rds.Pipeline()
	for matchId, item := range recordMap {
		message := sports.OddsResponseMessage{
			SentMessageStruct: messages2.SentMessageStruct{Type: messages2.OddsMessageType},
			OddsJson:          item,
		}
		bytes, _ := json.Marshal(message)
		err := pp.Set(o.genOddsKey(matchId), string(bytes), bbcache.CacheExpire).Err()
		if err != nil {
			global.Log.Errorf("set cache error: %v", err)
			continue
		}
		imsdk.GetSdk().BroadcastInterface(matchId, message, 0)
	}

	_, err := pp.Exec()
	if err != nil {
		global.Log.Errorf("Pipeline run error: %v", err)
	}
	return nil
}

// GetOddsCache 获取缓存
func (o *OddsCache) GetOddsCache(matchId int) string {
	result, err := o.rds.Get(o.genOddsKey(matchId)).Result()
	if err != nil {
		return ""
	}
	return result
}
